←
▼
▲
Function CrossFindClass::AddProject( in_ProjectName as string ) as CrossFind_ProjectClass
CrossFindClass のプロジェクトを追加します。
【引数】
in_ProjectName
プロジェクト名
返り値
追加したプロジェクト
ソース
→ ToolsLib.vbs
←
▼
▲
Property CrossFindClass::OutElements() as dictionary of CrossFind_OutElementClass
Key=ElementName
CrossFindClass の解析結果。
キーは、
で追加したモジュール名。
アイテムは、
ソース
→ ToolsLib.vbs
←
▼
▲
CrossFindClass のプロジェクト。
ソース
→ ToolsLib.vbs
.Name
string
要素の名前
ArrayClass of
CrossFind_ModuleClass
.Modules
モジュールの配列
←
▼
▲
Sub CrossFindClass::AddModule( in_ModuleName as string, in_Elements as array of string )
CrossFindClass のプロジェクトにモジュールを追加します。
【引数】
in_ModuleName
モジュール名
in_Elements
モジュールを構成する要素の名前の配列
ソース
→ ToolsLib.vbs
←
▼
▲
CrossFindClass の解析結果。
.Name
.OutModuleTypes
string
CrossFind_OutModuleTypeClass
で取得します。
要素の名前
ソース
→ ToolsLib.vbs
←
▼
▲
CrossFindClass の解析結果。
.Names
.Elements
ArrayClass of string
ArrayClass of string
で取得します。
同じ構成要素を持つモジュールの名前の配列
OutModuleTypes
モジュールを構成する要素の名前の配列
ソース
→ ToolsLib.vbs
←
▼
▲
アルゴリズム メモ (CrossFindClass)
b1 => { b1, b2 }
a1 => { a1, a2 }, { a1, b1 }
b1 => { b1, b2 }, { a1, b1 }
{ a1, b1 }
候補を絞っていく
候補がなくなったら、Module を追加する(A1.xml)か、
Element を追加する(A3.xml)か、どっち?
{ a1, b1 } をすべて(a1, b1)に追加する
a1 => { a1, a2 }
a2 => { a1, a2 }
a3 =>
{ a1, a2, a3 }
{ a1, a2, a3 }
{ a1, a2, a3 }
a3 に 全ての要素 { a1, a2, a3 } を追加
a3 を除いた { a1, a2 } を変更する
{ a1, b1 }
a1 => { a1, a2 }
{ a1, b1 }
(すべての)新規 (a3) を除いたモジュールがあれば、
要素すべて(a1 と b1)が既存なので
(既存の異なる2つのモジュールをクロスするので)
すべての要素を含むモジュールを見つける
=> { a1, a2 }, { a1, b1 }
=> { a1, b1 }
a3 を除いたのが { a1, b1 } でないときは、すべて追加する
a1 => { a1, a2 }
a2 => { a1, a2 }
a3 =>
新規 (a3) を除いたのが一部のときは、
({ a1, a3 } については、)
Module を追加する
{ a1, a3 }
{ a1, a3 }
←
▼
▲
←
▼
▲
Sub QuickSort( Arr as object array, iLeft as integer, iRight as integer,
CompareFunc as function, CompareFuncParam as variant )
【引数】
Arr
iLeft
ソートする配列。(*1)
ソートする範囲。配列番号の最小値
配列をクイックソートします。安定ソートではありません。
ソートする範囲。配列番号の最大値
iRight
CompareFunc
CompareFuncParam
CompareFunc の第3引数
Option Explicit
Class ClassA : Public id : End Class
Sub Main( Opt, AppKey )
ReDim arr(4)
Set arr(0) = new ClassA : arr(0).id = 6
Set arr(1) = new ClassA : arr(1).id = 3
Set arr(2) = new ClassA : arr(2).id = 4
Set arr(3) = new ClassA : arr(3).id = 4
Set arr(4) = new ClassA : arr(4).id = 1
QuickSort arr, 0, UBound( arr ), GetRef("CmpFunc1"), Empty
echo arr(0).id &","& arr(1).id &","& arr(2).id &","& _
arr(3).id &","& arr(4).id
End Sub
Function CmpFunc1( left, right, param )
CmpFunc1 = left.id - right.id '// 降順なら right.id - left.id
End Function
サンプル
→ クイックソート
配列の要素はオブジェクトであること。
参考
テスト
Arr 引数は、Visual Basic 標準の配列でも、ArrayClass でも構いませんが、
ArrayClass::Items は指定できません。(ソートされません。)
(*1)
→ T_QSort.vbs
関連
ソース
→ vbslib.vbs
出力
1,3,4,4,6
←
▼
▲
Sub ShakerSort( Arr as array of Object, iLeft as integer, iRight as integer,
CompareFunc as function, CompareFuncParam as variant )
【引数】
Arr
iLeft
ソートする配列。(*1)
ソートする範囲。配列番号の最小値。 通常 0
配列をシェーカーソートします。安定ソートです。
ソートする範囲。配列番号の最大値。 通常 UBound(Arr)
iRight
CompareFunc
CompareFuncParam
CompareFunc の第3引数
Class ClassA : Public id : End Class
Redim arr(4)
Set arr(0) = new ClassA : arr(0).id = 6
Set arr(1) = new ClassA : arr(1).id = 3
Set arr(2) = new ClassA : arr(2).id = 4
Set arr(3) = new ClassA : arr(3).id = 4
Set arr(4) = new ClassA : arr(4).id = 1
ShakerSort arr, 0, UBound( arr ), GetRef("CmpFunc1"), Empty
WScript.Echo arr(0).id &","& arr(1).id &","& arr(2).id &","& _
arr(3).id &","& arr(4).id
Function CmpFunc1( Left, Right, Param )
CmpFunc1 = Left.id - Right.id '// 降順なら Right.id - Left.id
End Function
サンプル
(src)
Dim line
ReDim lines(-1)
Set f = OpenForRead( target_result_txt )
Do Until f.AtEndOfStream
Set line = new String1
line.s = f.ReadLine()
ReDim Preserve lines( UBound( lines ) + 1 )
Set lines( UBound( lines ) ) = line
Loop
f = Empty
ShakerSort lines, 0, UBound( lines ), GetRef("StrCmpFunc"), 1
Function StrCmpFunc( Left, Right, Param )
StrCmpFunc = StrComp( Left.s, Right.s, Param )
End Function
Class String1
Public s
End Class
文字列を昇順にソートするサンプル
配列の要素はオブジェクトであること。
テスト
参考
Arr 引数は、Visual Basic 標準の配列でも、ArrayClass でも構いませんが、
ArrayClass::Items は指定できません。(ソートされません。)
(*1)
→ T_ShakerSort.vbs
関連
←
▼
▲
Function CompareFunction( Left as variant, Right as variant, Parameter as variant ) as integer
2つのパラメーターを比較する関数の型。 関数名は、CompareFunction とは限りません。
【引数】
Left
Right
1つ目の比較対象
2つ目の比較対象
Parameter
比較に使う補助パラメーター
返り値
0:等しい、正の数:Left が大きい、負の数:Rightが大きい (昇順:小→大のとき)
も、この関数型ですが、GetRef("StrComp") はエラーになります。
Left、Right は、
などの関数に指定するコレクションの要素です。
Param には、ShakerSort などの関数にある引数がそのまま渡ります。
昇順:小→大にするときは、Left - Right の値を返してください。
降順にするときは、返り値の正と負を変えてください。
関連
Function SampleStaticClass_comparePriority( in_Left, in_Right, in_Parameter )
SampleStaticClass_comparePriority = in_Left.Priority - in_Right.Priority
End Function
サンプル
←
▼
▲
Function StdCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターを標準的な方法で比較します。 (StdCompare = Standard Compare)
Left
Right
返り値
です。
数値
数値
-1, 0, 1 のどれか。(=や>と同じ)
文字列
文字列
StrComp と同じ (=や>と同じ)。Param 引数も同じ
オブジェクト
オブジェクト
の結果が True なら 0、 False なら -1
Empty
Empty
0
Empty 以外
Empty
1 (昇順でソートすると、Emptyが最後になる)
Empty
Empty 以外
-1
日付
日付
古い方が小さい値となる返り値 (=や>と同じ)
任意の型
Left と異なる型
-1 (エラーにはならない)
テスト
→ T_QSort.vbs # [T_CompareFunc]
Param 引数は、Left と Right が文字列のときだけ有効です。
→ vbslib.vbs
ソース
←
▼
▲
Function NameCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターを Name プロパティで比較します。
Left
Right
返り値
です。
オブジェクト
オブジェクト
Name プロパティを StrComp に渡した結果
オブジェクト以外
オブジェクト以外
0
オブジェクト以外
オブジェクト
-1 (昇順でソートすると、オブジェクト以外が最後になる)
オブジェクト
オブジェクト以外
1
テスト
→ T_QSort.vbs # [T_CompareFunc]
Param 引数は、StrComp 関数と同じです。
→ vbslib.vbs
ソース
←
▼
▲
Function NumStringCompare( Left as variant, Right as variant, Param as variant ) as integer
文字列の中の数字を複数桁の正の整数値として比較します。
です。
Left
Right
返り値
"A10"
"A2"
正の数値(Left > Right)、数値10と2 の比較
"A"
"a"
負の数値(Left < Right)
正の数値(Left > Right)、大文字小文字を区別しない
"a"
"B"
"A10"
"A10.2"
負の数値(Left < Right)
"A10.2"
"A10.10"
正の数値(Left > Right)、小数ではなく整数.整数とする
負の数値(Left < Right)
"A2"
"A1"
"A-2"
"A-1"
負の数値(Left < Right)、マイナスとは見なさない
関連
テスト
→ T_QSort.vbs
T_NumStringCompare
Param 引数には、Empty または
を指定してください。
ファイル名でソート
したときと同じになります。 ただし、フォルダーの区切り記号 \ や / を含む文字列
を比較するときは、
を使ってください。
→ vbslib.vbs
ソース
10.10 は小数ではなく、バージョン番号のように 10 の 10 であるとします。
←
▼
▲
Function NumStringNameCompare( Left as variant, Right as variant, Param as variant ) as integer
Name プロパティの文字列の中の数字を複数桁の正の整数値として比較します。
です。
参考
(src)
テスト
→ T_QSort.vbs
T_NumStringNameCompare
比較する処理の詳細
Param 引数には、Empty または
を指定してください。
→ vbslib.vbs
ソース
←
▼
▲
Function LengthCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターの長さを比較します。
文字列型のときは、文字列の長さを比較します。
Param がマイナスなら、返り値の正と負が入れ替わります。
です。
(src)
→ vbslib.vbs
ソース
←
▼
▲
Function LengthNameCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターの Name プロパティを LengthCompare で比較します。
です。
(src)
Param = -1 にすると、逆順になります。
→ vbslib.vbs
ソース
←
▼
▲
Function PathCompare( Left as string, Right as string, Param as variant ) as integer
2つの文字列をパスとして比較します。
です。
テスト
→ T_ShakerSort.vbs
T_SortByPath
参考
関連
パスとして比較する処理の詳細
→ vbslib.vbs
ソース
←
▼
▲
Function PathNameCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのオブジェクトの Name プロパティをパスとして比較します。
です。
テスト
→ T_ShakerSort.vbs
T_SortByPath
サンプル
arr = ArrayToNameOnlyClassArray( Array( "F", "EE\!", "EE\*", "EE", "E!E", "E\F", "E" ) )
ShakerSort arr, 0, UBound( arr ), GetRef("PathNameCompare"), Empty
arr = NameOnlyClassArrayToArray( arr )
Assert IsSameArray( arr, Array( "E", "E\F", "E!E", "EE", "EE\*", "EE\!", "F" ) )
フォルダーの中にあるフォルダーやファイルは、連続します。
たとえば、通常の文字コードでソートしたら "A!B", "A\!", "A\*", "A\C" の順になりますが、
PathNameCompare では、"A\*", "A\!", "A\C", "A!B" の順になります。
フォルダー区切り記号(\,/)、ワイルドカード(*)、ピリオド(.)を、文字コードが小さい文字(タブ)
として処理します。
→ vbslib.vbs
ソース
Param を負の値とすると、大小比較の結果が逆になります。
そうでないときは、Param = Empty または Param を正の値にしてください。
関連
参考
ファイル名でソート
したときのように、数字は整数として比較します。
参考
→ Ascii コード
→ StrCmpLogicalW - Win32API
←
▼
▲
Function ParentPathCompare( Left as string, Right as string, Param as variant ) as integer
パスをソートした状態から、親フォルダーを後にするような比較を行います。
です。
通常、Param = -1 (Param <= 0) にして、親フォルダーが後になるようにします。
Param < 0 のときは、親フォルダーが前になるようにします。
親子関係以外の順序は変更しません。
テスト
→ T_ShakerSort.vbs
T_SortByParentPath
→ vbslib.vbs
ソース
サンプル
"a", "a\1", "aa", "b", "b\1", "b\1\2"
"a\1", "a", "aa", "b\1\2", "b\1", "b"
ParentPathCompare を使ってソートしたときの例:
ソート前:
ソート後:
←
▼
▲
Function NoCompareFunction( Left as variant, Right as variant, Param as variant ) as integer
Param 引数の内容をそのまま返します。
です。
→ vbslib.vbs
ソース
←
▼
▲
Function IsReverseSortOption( in_Option as variant ) as boolean
逆順でソートするオプションが指定されているかどうかを返します。
ソース
in_Option 引数の値
返り値
Empty
False
False
-1
True
0
+1
False
False
テスト
→ T_ShakerSort.vbs
→ vbslib.vbs
←
▼
▲
関連
→ PArray_doShakerSort (clib)
←
▼
▲
関連
←
▼
▲
Function CInt2( v as string ) as integer
CInt でエラーが発生する値を v に指定したときは、0 を返します。
文字列を数値に変換します。
(src)
VBScript では、CInt は、符号付き16ビット整数ですが、CInt2 は
CLng に相当する 符号付き32ビット整数に対応しています。
関連
→ GetNumWithZeroAtLeft
←
▼
▲
Function Trim2( v as string ) as string
文字列の端の空白文字だけでなく、タブ文字、改行文字もカットした文字列を返します。
Function LTrim2( v as string ) as string
Function RTrim2( v as string ) as string
(src)
←
▼
▲
Function AlignString( in_InputData as integer, in_MinimumLength as integer,
in_FillingCharacter as string, in_ValueIfOver as Empty or string ) as string
文字列や数値の左または右に、空白や 0 などを並べて、幅を合わせた文字列に変換します。
out = AlignString( "a", 3, " ", Empty ) : Assert out = " a"
out = AlignString( 123, 6, "0", Empty ) : Assert out = "000123"
out = AlignString(-123, 6, " ", Empty ) : Assert out = " -123"
out = AlignString( "AB",-5," ", Empty ) : Assert out = "AB "
out = AlignString(-123, 3, " ", "###" ) : Assert out = "###"
out = AlignString(-123, 3, " ", Empty ) : Assert out = "-123"
out = AlignString(-123, 6, " ", "###" ) : Assert out = " -123"
【引数】
in_InputData
in_MinimumLength
変換される文字列や数値
返り値の文字数の最小値、マイナス=左詰め
in_ValueIfOver
in_MinimumLength を超えたときの返り値、または、Empty
サンプル
幅を合わせた文字列
返り値
ソース
→ vbslib.vbs
in_ValueIfOver = Empty のときは、返り値が in_MinimumLength を超える文字数になる
可能性があります。
テスト
→ T_Str.vbs
T_AlignString
in_FillingCharacter
幅を広げるときに並べる文字